---Name 演示Emmylua的注解
---Date 2023-02-16
---Auth levi
---Link https://emmylua.github.io/zh_CN/annotation.html

---注解关键字
--[[
    ---类声明注解
    MY_TYPE: 类型
    PARENT_TYPE: 父类型
    comment: 注解内容
    格式: ---@class MY_TYPE[:PARENT_TYPE] [@comment]
    
    ---属性注解
    public: 公有成员
    protected: 受保护成员
    private: 私有成员
    field_name: 属性名
    FIELD_TYPE: 属性类型
    OTHER_TYPE: 其他属性类型
    comment: 注解内容
    ---@field [public|protected|private] field_name FIELD_TYPE[|OTHER_TYPE] [@comment]

    ---类型标记注解
    TARGET_TYPE: 类型
    格式: ---@type TARGET_TYPE [@comment]

    ---数组类型注解
    MY_TYPE: 类型
    ---@type MY_TYPE[]

    ---字典类型注解
    KEY_TYPE: 键类型
    VALUE_TYPE: 值类型
    ---@type table<KEY_TYPE, VALUE_TYPE>

    ---别名注解
    NEW_NAME: 新的类型名
    ORIGIN_TYPE: 原类型
    ---@alias NEW_NAME ORIGIN_TYPE

    ---函数类型注解
    param: 参数变量
    MY_TYPE: 参数类型
    RETURN_TYPE: 函数返回类型
    ---@type fun(param:MY_TYPE):RETURN_TYPE

    ---参数类型标记注解
    MY_TYPE: 类型
    OTHER_TYPE: 其他类型
    comment: 注解内容
    ---@param param_name MY_TYPE[|OTHER_TYPE] [@comment]
    
    ---函数返回值注解
    MY_TYPE: 类型
    OTHER_TYPE: 其他类型
    comment: 注解内容
    ---@return MY_TYPE[|OTHER_TYPE] [@comment]
    
    ---泛型注解(不匹配)
    T1: 新的类型名
    PARENT_TYPE: 父类型
    PARENT_TYPE_2: 可选父类型
    ---@generic T1 [: PARENT_TYPE] [, PARENT_TYPE_2]

    ---不定参数注解(不匹配)
    ---@vararg TYPE

    ---字面量类型
    ---@param event string | "'onClosed'" | "'onData'"

    ---内嵌语言
    LANGUAGE_ID: 语言名 {JSON, LUA}
    ---@language LANGUAGE_ID

    ---引用注解
    PARENT_TYPE: 引用类型
    FUNCTION_NAME: 引用类型中的函数
    ---@see PARENT_TYPE#FUNCTION_NAME
]]

---@class Ref @引用计数类
---@field private _refCount number @当前引用数
local Ref = class("Ref")

---@class Actor : Ref @演员类
---@field protected _id number @id
---@field public _name string @名字
local Actor = class("Actor", Ref)

---初始化
---@param params table @初始化的参数
---@param params.id number @id
---@param params.name string @名字
function Actor:ctor(params)
    self._id = params.id or 0
    self._name = params.name or ""
end

---说话(废弃接口)
---@param wordStr string @说话内容
---@param actObj Actor|string @说话对象(可以是Actor类, 或者是某个Actor对象的名字)
---@deprecated
function Actor:say(wordStr, actObj)
    if type(actObj) == "string" then
        -- findActorByName()
    else
        -- ...
    end
end

---说话
---@param wordStr string @说话内容
---@param actObj Actor|string @说话对象(可以是Actor类, 或者是某个Actor对象的名字)
---@return boolean @返回是否说话成功
---@return string @返回说话失败的原因
function Actor:sayEX(wordStr, actObj)
    if type(actObj) == "string" then
        -- findActorByName()
    else
        -- ...
    end
    local ok = false
    local errMsg = "说话失败了的原因"
    return ok, errMsg
end

---@alias Callback fun(type: string, data: any):void

---执行函数
---@param cb Callback @函数
function Actor:doFunc(cb)
    if type(cb) == "function" then
       local res = cb()
    end
end

---深拷贝自己
---@return Actor @返回自己
function Actor:deepcopy()
    return clone(self)
end

---@class Car @汽车类
local Car = class("Car")

---改变状态
---@param s "Run" | "Stop" @状态字符串
---@param cb Callback | "function(t, data) print(t) end" @回调函数
function Car:changeState(s, cb)
    
end

---@class Object : Car, Actor @对象类
local Object = class("Object")

---解析对象参数
---@vararg string
function Object:parse( ... )
    ---@language JSON
    local jsonText = [[{
        "id": 101,
        "name": "小白"
    }]]
end

---解析参数
---@see Object#parse
local function parse( ... )
    -- body
end

---主函数入口
local function main()
    ---@type Actor
    local act1 = Actor.new({
        id = 101,
        name = "小白"
    })

    ---@type Actor
    local act2 = Actor.new({
        id = 102,
        name = "小红"
    })

    act1:say("你好！", "小红")
    act1:sayEX("你好！", act2)

    ---@alias New_Actor Actor
    local New_Actor = act1:deepcopy()

    ---@type Actor[]
    local actorList = {}
    for k, v in pairs(actorList) do
    end

    local actorList2 = {}
    ---@param v Actor
    for k, v in pairs(actorList2) do
        
    end

    ---@type Object
    local obj = nil

    ---@type table<number, string>
    local map = {}

    --测试配置的解析排除项
    local item_cfg = require("csv.item_cfg")
    item_cfg.getName()
    local lib = require("lib.lib")
    lib.checkLib()
    local ItemVO = require("src.core.vo.ItemVO")
    ItemVO.getName()
end
